Segmentez des clients d'un site e-commerce

Sommaire

  1. Préambule
    1.1 Problématique
    1.2 Objectifs dans ce projet
  2. Import des librairies
  3. Définition des fonctions
  4. Import et analyse des fichiers à étudier
  5. Merge des DataFrames
  6. Traitement des catégories manquantes
  7. Traitement des variables contenant des Dates
  8. Exploration des données
    8.1 Analyse générale des DataFrame
    8.2 Analyse des commandes
    8.3 Analyse des produits
    8.4 Analyse des ventes
    8.5 Analyse des clients
    8.6 Analyse des Reviews
  9. Conservation des commandes 'delivered' uniquement
  10. Features Engineering
    10.1 Retard de livraison
    10.2 Paiement par carte
    10.3 Score en fonction du type de paiement utilisé
    10.4 Nombre de commande par client
    10.5 Montant total commandé / client
    10.6 Montant total payé / client
    10.7 Panier Moyen / Client
    10.8 Jour de la semaine / commande
    10.9 Mois del'année / commande
    10.10 Délai depuis la dernière commande
    10.11 Satisfaction Client
  11. Suppression des colonnes inutiles
  12. Filtrage des customer_unique_id
  13. Analyse de corrélation
  14. Standardisation des données
    14.1 Analyse des données avant Standardisation
    14.2 Analyse des données après Standardisation
  15. Standardisation des données
  16. Traitement des outliers
  17. Sauvegarde et Restauration des DataFrame 17.1 Sauvegarde des DataFrame
    17.2 Restauration des DataFrame
  18. Segmentation des clients
  19. Test avec 3 features
    19.1 Coefficient de silhouette
    19.2 K-Means
    19.3 PCA
    19.4 Graphique BoxPlot
    19.5 Diagramme de Kiviat
    19.6 DBSCAN
    19.7 Agglomerative Clustering - Dendrogram
           19.7.1 Test avec 10 000 données
  20. Test avec 4 features
    20.1 Coefficient de silhouette
    20.2 K-Means
    20.3 PCA
    20.4 Graphique BoxPlot
    20.5 Diagramme de Kiviat
    20.6 DBSCAN
    20.7 Agglomerative Clustering - Dendrogram
           20.7.1 Test avec 10 000 données
  21. Test avec 5 features
    21.1 Coefficient de silhouette
    21.2 K-Means
    21.3 PCA
    21.4 Graphique BoxPlot
    21.5 Diagramme de Kiviat
    21.6 DBSCAN
    21.7 Agglomerative Clustering - Dendrogram
           21.7.1 Test avec 10 000 données
  22. Contrat de Maintenance
    22.1 Modèle et nombre de features retenus
    22.2 Description des différentes étapes
    22.3 Création du DataFrame data
    22.4 Création des fonctions necessaires au calcul de l'Ajusted_Rand_Score
    22.5 Affichage de la stabilité des clusters au cours du temps
    22.6 Conclusion & Proposition de contrat de maintenance

1. Préambule

1.1 Problématique

L'entreprise Olist souhaite que nous fournissions à ses équipes
d'e-commerce une segmentation des clients qu’elles pourront utiliser
au quotidien pour leurs campagnes de communication.

1.2 Objectifs dans ce projet

Il y en a 3 :

  1. Comprendre les différents types d’utilisateurs
    grâce à leur comportement et à leurs données personnelles
  2. Fournir à l’équipe marketing une description actionnable
    de notre segmentation et de sa logique sous-jacente
    pour une utilisation optimale
  3. Réaliser une proposition de contrat de maintenance
    basée sur une analyse de la stabilité des segments au cours du temps

2. Import des librairies & réglable Google Colab

3. Définition des fonctions

4. Import et analyse des fichiers à étudier

Olist nous fournit une base de données anonymisée
comportant des informations sur l’historique de commandes,
les produits achetés, les commentaires de satisfaction,
et la localisation des clients depuis janvier 2017.

Voici le schéma de la base de données d'Olist :

J'importe chaque base de donnée dans un DataFrame distinct :

5. Merge des DataFrames

Je merge l'ensemble des DataFrame,
en réalisant systématiquement une **jointure à gauche**,
en partant du DataFrame df_customer
:

6. Traitement des catégories manquantes

Certaines traductions en anglais de catégories sont manquantes.
Je les ajoutes :

7. Traitement des variables contenant des Dates

Je convertis au bon format les colonnes contenant des dates :

8. Exploration des données

8.1 Analyse générale des DataFrame

J'attribue un nom à chaque DataFrame
avant d'afficher leurs caractéristiques
:

8.2 Analyse des commandes

Listing des différents statuts
possibles pour une commande
:

Focus sur les statuts contenant
des valeurs manquantes
:

8.3 Analyse des produits

Nombre de produit référencés par catégorie :

Nombre de valeurs manquantes par produit (description) :

Catégories qui recensent le plus de produits :

Prix des produits :

8.4 Analyse des ventes

Nombre de vente / Catégorie

Volume des 30 produits les plus vendus :

Volume monétaire des ventes des 30 premières catégories (en euros) :

Montant moyen par commande (sans Outliers) :

8.5 Analyse des clients

Nombre et pourcentage de clients par pays

8.6 Analyse des Reviews

Pourcentage de reviews renseignées par les clients :

Moyenne des reviews :

9. Conservation des commandes 'delivered' uniquement

Pour la suite du projet, nous nous intéressons
qu'aux commandes qui ont été livrées.
Je filtre les autres commandes (envoyées, annulées, ...)

10. Features Engineering

Nous allons maintenant créer/calculer de nouvelles variables
à partir des informations que nous avons à notre disposition
:

L'objectif est de comprendre nos clients et d'obtenir
des informations précises, qui décrieront au mieux leurs
comportements d'achat et l'expérience qu'ils ont eu
lors de leur(s) commande(s) sur Olist.

Ainsi, pour un client donné nous allons chercher à savoir:

10.1 Retard de livraison

Indique, en jours, la différence entre la date
de livraison réelle, et la date de livraison prévisionnelle
:

Suppression des 8 commandes n'ayant pas de 'late_delivery' :

On ne conserve que les moyennes des valeurs / client :

10.2 Paiements par carte

Je renseigne les valeurs manquantes par l'indication '**not_defined**' :

Je décide de ne conserver que l'information de paiement 'par carte'
en mutualisant les paiements par carte de crédit et carte de débit.

10.3 Score en fonction du type de paiement utilisé

Pour identifier les clients selon leur moyen de paiement préféré, je leur attribue un score :

10.4 Nombre de commandes par client

Plus de 83% des clients n'ont réalisés qu'une seule commande sur le site.
13.5% ont réalisé 2 commandes.
3.1% seulement des clients ont réalisés plus de 2 commandes.

10.5 Montant total commandé / client

10.6 Montant total payé / client

10.7 Panier Moyen / Client

Calcul du nombre d'articles par commande

Calcul du panier moyen

Suppression de la colonne indiquant le nombre d'articles par commande

10.8 Jour de la semaine / commande

10.9 Mois de l'année / commande

10.10 Délai depuis la dernière commande

Calcul de la date de la dernière commande existante
comme date de référence pour le calcul de la récence
de chaque commande pour chaque client
:

On ne conserve que la valeur de la commande la plus récente :

10.11 Satisfaction Client

11. Suppression des colonnes inutiles

12. Filtrage des customer_unique_id

L'objectif ici est de ne conserver qu'une seule entrée / client.
Un client est identifié par son identifiant 'customer_unique_id'.

Dimension de **df** *avant* filtrage des clients :

On ne conserve qu'un seul enregistrement de chaque client :

Je supprime également la colonne '**customer_unique_id**',
les clients étant maintenant identifiés par leur **Index**
:

Dimension de **df** *après* filtrage des clients :

13. Analyse de corrélation

Globalement les features ne sont pas corrélées entre-elles.
Cependant, quelques exceptions :

14. Standardisation des données

L'objectif à cette étape est de ramener les données sur une même échelles.
Nous essayons également d'obtenir une distribution des données qui
se rapproche le plus possible d'une distribution Normale.

14.1 Analyse des données avant Standardisation

14.2 Analyse des données après Standardisation

J'utilise la fonction PowerTransform
et je compare le résultat en utilisant
les méthodes Yeo-Johnson et Box-Cox.

A noter que la transformation Box-Cox
ne peut s'appliquer que sur des valeurs strictement positives.

On observe que les deux transformations donnent approximativement les mêmes résulats.
Je décide donc d'utiliser la transformation Yeo-Johnson.

15. Standardisation des données

Sauvegarde de DF avant Standardisation des données :

Après analyse je décide d'utiliser la transformation Yeo-Johnson
sur l'ensemble de mes features à l'exception de la feature 'total_of_orders'
pour laquelle j'utilise la transformation MinMaxScaler.

Je recrée un DataFrame avec mes valeurs transformées :

Sauvegarde de DF après Standardisation des données :

16. Traitement des outliers

N'ayant pas détecter de valeur aberrantes,
seulement des valeurs extrêmes que je juge pertinentes,
je décide de ne pas traiter les outliers.

17. Sauvegarde et Restauration des DataFrame

17.1 Sauvegarde des DataFrame

17.2 Restauration des DataFrame

18. Segmentation des clients

Je vais maintenant segmenter mes clients.

Je décide de commencer pour une segmentation **RFM**.

La méthode de segmentation **RFM** permet un classement
des clients en fonction de leurs habitudes d'achat
défini par leur :

J'utiliserai différentes techniques de segmentation,
comme K-Means, DBScan ou encore Agglomerative Clustering
L'objectif sera d'obtenir des segmentations qui soient à la fois cohérentes
et exploitables pour les équipes marketing.

Pour cette raison, pour chaque segmentation client,
j'évaluerai les segmentations selon les critères suivants :

Je répèterai ces opérations en ajoutant des features
aux features RFM existantes, une à une, jusqu'à obtenir
une segmentation que je jugerai satisfaisante
d'un point de vue métier.

19. Test avec 3 features

Features utilisées :

Création du DataFrame 'df3' contenant les valeurs
originales non standardisées, pour l'affichage
des graphiques BoxPlot.

Création du DataFrame 'df3std'
contenant les valeurs standardisées :

Je renomme les colonnes pour plus de lisibilité :

19.1 Coefficient de silhouette

Le coefficient de silhouette est une mesure de
qualité d'une partition d'un ensemble de données
.

Pour chaque point, son coefficient de silhouette
est la différence entre la distance moyenne
avec les points du même groupe que lui (cohésion)
et la distance moyenne avec les points des autres
groupes voisins (séparation).

Si cette différence est négative,
le point est en moyenne plus proche du groupe voisin
que du sien et il est donc mal classé.

A l'inverse, si cette différence est positive,
le point est en moyenne plus proche de son groupe
que du groupe voisin et il est donc bien classé.

Le coefficient de silhouette proprement dit est
la moyenne du coefficient de silhouette pour tous les points.

J'utilise l'algorithme KMeans pour calculer le coefficient
de silhouette, pour différents nombres de clusters allant de 3 à 20.
Nous analyserons ensuite la valeurs des différents coefficients
de silhouette pour déterminer, à priori, le nombre optimal de clusters.
Nous utiliserons également la méthode du coude via la fonction KElbowVisualizer.

Les valeurs du coefficient de silhouette ne varient pas
significativement quel que soit la valeur de k.
Cependant, on peut noter que les valeurs de k
les plus optimisés sont 4, 7, 11 et 13.
Il peut être compliqué d'd'interpréter plus de 10 clusters,
et je vais donc me concentrer ici sur les valeurs de k valant 4 et 7,
plus utile pour une interprétation métier.

Affichons maintenant les différents clusters en fonction de leur population :

Le visualiseur de silhouette affiche le coefficient de silhouette pour chaque cluster,
en évaluant visuellement leur densité et leur séparation par rapport aux autres clusters.

Le score est calculé en faisant la moyenne du coefficient de silhouette
pour chaque échantillon par cluster, calculé comme la différence
entre la distance moyenne intra-cluster et la distance moyenne
au plus proche cluster pour chaque échantillon,
normalisée par la valeur maximale.
Cela donne un score entre -1 et +1, où les scores proches de +1 indiquent
une séparation élevée et les scores proches de -1 indiquent
que les échantillons peuvent avoir été affectés au mauvais cluster.

Dans les graphiques de SilhouetteVisualizer, les clusters ayant des scores
plus élevés ont des silhouettes plus larges, mais les grappes qui sont moins
cohésives n'atteignent pas le score moyen de toutes les clusters,
qui est représenté par une ligne verticale pointillée en rouge.

3 des 4 clusters semblent très homogènes,
aussi bien en population qu'en fonction de leur coefficient de silhouette.

Un des clusters se démarque cependant par une population beaucoup plus faible
mais avec un coefficient de silhouette nettement plus élevé.
Ce groupe de client semble se démarquer nettement du reste de la population.

Enfin, aucun des clusters n'a d'échantillon avec un coefficient de silhouette inférieur à 0.

Ici les différents clusters sont un peu moins homogènes qu'avec seulement 4 clusters.
Quelques échantillons appartenant à différents cluster ont un coefficient
de silhouette inférieur à 0 et peuvent aller jusqu'à -0.1.
On observe toujours notre cluster à faible population
et aux taux de coefficient de silhouette élevé.

A ce stade, avec 3 features, il me semble plus pertinent
de partitionner nos clients en 4 clusters.

Quel que soit le nombre de cluster choisi,
on remarque qu'un cluster reste identique.
Il contient moins de clients que n'importe quel autre cluster
mais possède une bonne valeur de coefficient de silhouette.

19.2 K-Means

Utilisation de K-Means pour calculer 4, 7, 11 et 13 clusters,
les valeurs optimales en nombre de clusters d'après le coefficient de silhouette.

19.3 PCA

J'applique une Analyse en Composante Principale à mon jeu de donnée
en le ramenant en 2 dimensions afin de pouvoir visualiser graphiquement
les différents clusters
:

Affichage des clusters en fonction du nombre total de clusters :

Affichage du nombre de Client/Cluster en fonction du nombre de clusters total :

19.4 Graphique BoxPlot

J'affiche pour chaque feature,
les différents clusters sous forme de boxplot
en fonction du nombre de clusters total.

Cette visualisation doit nous permetre de comprendre
et d'interpeter les profils des différents clients.

Interpretation lorsque le jeu de donnée est divisé en :

19.5 Diagramme de Kiviat

Le diagramme de Kiviat nous permet de visualiser rapidement
et efficacement le profil client de chaque cluster.
Le graphique affiche les valeurs moyennes, normalisés entre 0 et 1
de chaque feature, pour chaque cluster.
Cela permet de déterminer d'un seul coup le profil type
de chaque groupe de client que KMeans a identifié.

Je ne conserve que le nombre de *clusters optimal*
pour l'affichage des **Diagrammes de Kiviat**
:

19.6 DBSCAN

DBSCAN est un algorithme de clustering qui s’appuie sur la densité
estimée des clusters pour effectuer le partitionnement.

L'algorithme DBSCAN utilise 2 paramètres :

Les paramètres d'entrées sont donc une estimation de la densité
de points des clusters.
L'idée de base de l'algorithme est ensuite, pour un point donné,
de récupérer son epsilon-voisinage et de vérifier qu'il contient bien
MinPts points ou plus.
Ce point est alors considéré comme faisant partie d'un cluster.
On parcourt ensuite l'epsilon-voisinage de proche en proche afin
de trouver l'ensemble des points du cluster.

Contrairement à KMeans, ici nous ne choisissons pas
à l'avance le nombre de Cluster.

Suppression des colonnes contenant les clusters K-Means dans **df3std** et **df3** :

Test de l'algorithme **DBSCAN** pour **EPS allant de 0.1 à 1.5** par pas de **0.1** :

Pour chaque **EPS** testé, affichage du nombre de cluster et du coefficient de silhouette :

Affichage du nombre de clients / cluster en fonction de **EPS** :

L'utilisation de DBSCAN dans notre cas est inexploitable
pour une utilisation métier car les clusters ne sont pas équilibrés.

Nous avons par exemple des clusters contenants une dizaine de clients
alors qu'un autre cluster en contient 89977.

19.7 Agglomerative Clustering - Dendrogram

Le dendrogramme est une arborescence qui affiche les groupes formés
par le regroupement des observations à chaque étape et leurs niveaux de similarité.
Le niveau de similarité est mesuré le long de l'axe vertical
et les différentes observations sont répertoriées le long de l'axe horizontal.

19.7.1 Test avec 10 000 données

Plusieurs remarques sont à prendre en compte sur l'utilisation de cette méthode :

20. Test avec 4 features

Features utilisées :

Création du DataFrame 'df4' contenant les valeurs
originales non standardisées, pour l'affichage
des graphiques BoxPlot.

Création du DataFrame 'df4std'
contenant les valeurs standardisées :

Je renomme les colonnes pour plus de lisibilité :

20.1 Coefficient de silhouette

Le coefficient de silhouette est une mesure de
qualité d'une partition d'un ensemble de données
.

Pour chaque point, son coefficient de silhouette
est la différence entre la distance moyenne
avec les points du même groupe que lui (cohésion)
et la distance moyenne avec les points des autres
groupes voisins (séparation).

Si cette différence est négative,
le point est en moyenne plus proche du groupe voisin
que du sien et il est donc mal classé.

A l'inverse, si cette différence est positive,
le point est en moyenne plus proche de son groupe
que du groupe voisin et il est donc bien classé.

Le coefficient de silhouette proprement dit est
la moyenne du coefficient de silhouette pour tous les points.

J'utilise l'algorithme KMeans pour calculer le coefficient
de silhouette, pour différents nombres de clusters allant de 3 à 20.
Nous analyserons ensuite la valeur des différents coefficient
de silhouette pour déterminer, à priori, le nombre optimal de cluster.
Nous utiliserons également la méthode du coude via la fonction KElbowVisualizer.

Les valeurs du coefficient de silhouette ne varient pas
significativement quel que soit la valeur de k.
Cependant, on peut noter que les valeurs de k
les plus optimisés sont 3 et 7.

Affichons maintenant les différents clusters en fonction de leur population :

Le visualiseur de silhouette affiche le coefficient de silhouette pour chaque cluster,
en évaluant visuellement leur densité et leur séparation par rapport aux autres clusters.

Le score est calculé en faisant la moyenne du coefficient de silhouette
pour chaque échantillon par cluster, calculé comme la différence
entre la distance moyenne intra-cluster et la distance moyenne
au plus proche cluster pour chaque échantillon,
normalisée par la valeur maximale.
Cela donne un score entre -1 et +1, où les scores proches de +1 indiquent
une séparation élevée et les scores proches de -1 indiquent
que les échantillons peuvent avoir été affectés au mauvais cluster.

Dans les graphiques de SilhouetteVisualizer, les clusters ayant des scores
plus élevés ont des silhouettes plus larges, mais les grappes qui sont moins
cohésives n'atteignent pas le score moyen de toutes les cluster,
qui est représenté par une ligne verticale pointillée en rouge.

3 des 4 clusters semblent assez homogènes,
aussi bien en population qu'en fonction de leur coefficient de silhouette.

Un des clusters se démarque cependant par une population beaucoup plus faible
mais avec un coefficient de silhouette nettement plus élevé.
Ce groupe de client semble se démarquer nettement du reste de la population.

Enfin, aucun des clusters n'a d'échantillon avec un coefficient de silhouette inférieur à 0.

Ici aussi les différents clusters semblent assez homogènes.
Quelques échantillons appartenant à différents clusters ont un coefficient
de silhouette inférieur à 0 et ne semble pas aller au-delà de -0.05.
On observe toujours notre cluster à faible population
et aux taux de coefficient de silhouette élevé.

A ce stade, avec 4 features, il m'est difficile de déterminer
le nombre de clusters optimal autrement que par le score
de silhouette globale qui favorise une clusterisation à 3 clusters.

Quel que soit le nombre de clusters choisi,
on remarque qu'un cluster reste identique.
Il contient moins de clients que n'importe quel autre cluster
mais possède une bonne valeur de coefficient de silhouette.

20.2 K-Means

Utilisation de K-Means pour calculer 3 et 7 clusters,
les valeurs optimales en nombre de clusters d'après
le coefficient de silhouette.

20.3 PCA

J'applique une Analyse en Composante Principale à mon jeu de donnée
en le ramenant en 2 dimensions afin de pouvoir visualiser graphiquement
les différents clusters
:

Affichage des clusters en fonction du nombre total de clusters :

Affichage du nombre de Client/Cluster en fonction du nombre de cluster total :

20.4 Graphique BoxPlot

J'affiche pour chaque feature,
les différents clusters sous forme de boxplot
en fonction du nombre de clusters total.

Cette visualisation doit nous permettre de comprendre
et d'interpréter les profils des différents clients.

Interprétation lorsque le jeu de donnée est divisé en :

20.5 Diagramme de Kiviat

Le diagramme de Kiviat nous permet de visualiser rapidement
et efficacement le profil client de chaque cluster.
Le graphique affiche les valeurs moyennes, normalisés entre 0 et 1
de chaque features, pour chaque cluster.
Cela permet de déterminer d'un seul coup le profil type
de chaque groupe de client que KMeans a identifié.

Je ne conserve que le nombre de *clusters optimal*
pour l'affichage des **Diagramme de Kiviat**
:

20.6 DBSCAN

DBSCAN est un algorithme de clustering qui s’appuie sur la densité
estimée des clusters pour effectuer le partitionnement.

L'algorithme DBSCAN utilise 2 paramètres :

Les paramètres d'entrées sont donc une estimation de la densité
de points des clusters.
L'idée de base de l'algorithme est ensuite, pour un point donné,
de récupérer son epsilon-voisinage et de vérifier qu'il contient bien
MinPts points ou plus.
Ce point est alors considéré comme faisant partie d'un cluster.
On parcourt ensuite l'epsilon-voisinage de proche en proche afin
de trouver l'ensemble des points du cluster.

Contrairement à KMeans, ici nous ne choisissons pas
à l'avance le nombre de Clusters.

Suppression des colonnes contenant les clusters K-Means dans **df4std** et **df4** :

Test de l'algorithme DBSCAN pour **EPS allant de 0.1 à 1.5** par pas de **0.1** :

Pour chaque EPS testé, affichage du nombre de cluster et du coefficient de silhouette :

Affichage du nombre de clients / cluster en fonction de **EPS** :

L'utilisation de DBSCAN dans notre cas est inexploitable
pour une utilisation métier car les clusters ne sont pas équilibrés.

Nous avons par exemple des clusters contenants une dizaine de clients
alors qu'un autre cluster en contient 52522.

20.7 Agglomerative Clustering - Dendrogram

Le dendrogramme est une arborescence qui affiche les groupes formés
par le regroupement des observations à chaque étape et leurs niveaux de similarité.
Le niveau de similarité est mesuré le long de l'axe vertical
et les différentes observations sont répertoriées le long de l'axe horizontal.

20.7.1 Test avec 10 000 données

Plusieurs remarques sont à prendre en compte sur l'utilisation de cette méthode :

21. Test avec 5 features

Features utilisées :

Création du DataFrame 'df5' contenant les valeurs
originales non standardisées, pour l'affichage
des graphiques BoxPlot.

Création du DataFrame 'df5std'
contenant les valeurs standardisées :

Je renomme les colonnes pour plus de lisibilité :

21.1 Coefficient de silhouette

Le coefficient de silhouette est une mesure de
qualité d'une partition d'un ensemble de données
.

Pour chaque point, son coefficient de silhouette
est la différence entre la distance moyenne
avec les points du même groupe que lui (cohésion)
et la distance moyenne avec les points des autres
groupes voisins (séparation).

Si cette différence est négative,
le point est en moyenne plus proche du groupe voisin
que du sien et il est donc mal classé.

A l'inverse, si cette différence est positive,
le point est en moyenne plus proche de son groupe
que du groupe voisin et il est donc bien classé.

Le coefficient de silhouette proprement dit est
la moyenne du coefficient de silhouette pour tous les points.

J'utilise l'algorithme KMeans pour calculer le coefficient
de silhouette, pour différents nombres de clusters allant de 3 à 20.
Nous analyserons ensuite la valeurs des différents coefficients
de silhouette pour déterminer, à priori, le nombre optimal de clusters.
Nous utiliserons également la méthode du coude via la fonction KElbowVisualizer.

Les valeurs du coefficient de silhouette ne varient pas
significativement quel que soit la valeur de k.
Cependant, on peut noter que les valeurs de k
les plus optimisés sont 3 et 9.

Affichons maintenant les différents clusters en fonction de leur population :

Le visualiseur de silhouette affiche le coefficient de silhouette pour chaque cluster,
en évaluant visuellement leur densité et leur séparation par rapport aux autres clusters.

Le score est calculé en faisant la moyenne du coefficient de silhouette
pour chaque échantillon par cluster, calculé comme la différence
entre la distance moyenne intra-cluster et la distance moyenne
au plus proche cluster pour chaque échantillon,
normalisée par la valeur maximale.
Cela donne un score entre -1 et +1, où les scores proches de +1 indiquent
une séparation élevée et les scores proches de -1 indiquent
que les échantillons peuvent avoir été affectés au mauvais cluster.

Dans les graphiques de SilhouetteVisualizer, les clusters ayant des scores
plus élevés ont des silhouettes plus larges, mais les grappes qui sont moins
cohésives n'atteignent pas le score moyen de toutes les cluster,
qui est représenté par une ligne verticale pointillée en rouge.

Les clusters ne sont pas très homogènes. Ils se distinguent tous par une population
et un score de coefficient de silhouette moyen nettement différents.

Un des clusters se démarque particulièrement des deux autres par une population
beaucoup plus faible et un coefficient de silhouette nettement plus élevé.

Enfin, aucun des clusters n'a d'échantillon avec un coefficient de silhouette inférieur à 0.

Ici aussi les clusters ne semblent pas très homogènes entre-eux.

De plus certains clusters ont des échantillons de leur population
avec des coefficients de silhouette inférieurs à 0 et atteignant parfois -0.8.

On retrouve cependant notre cluster ayant une faible population
mais un coefficient de silhouette élevé.

A ce stade, avec 5 features, il me semble plus pertinent
de partitionner nos clients en 3 clusters.

21.2 K-Means

Utilisation de K-Means pour calculer 3 et 9 clusters,
les valeurs optimales en nombre de clusters d'après le coefficient de silhouette.

21.3 PCA

J'applique une Analyse en Composante Principale à mon jeu de donnée
en le ramenant en 2 dimensions afin de pouvoir visualiser graphiquement
les différents clusters
:

Affichage des clusters en fonction du nombre total de clusters :

Affichage du nombre de Clients/Cluster en fonction du nombre de clusters total :

21.4 Graphique BoxPlot

J'affiche pour chaque feature,
les différents clusters sous forme de boxplot
en fonction du nombre de clusters total.

Cette visualisation doit nous permettre de comprendre
et d'interpréter les profils des différents clients.

Interpretation lorsque le jeu de donnée est divisé en :

21.5 Diagramme de Kiviat

Le diagramme de Kiviat nous permet de visualiser rapidement
et efficacement le profil client de chaque cluster.
Le graphique affiche les valeurs moyennes, normalisés entre 0 et 1
de chaque features, pour chaque cluster.
Cela permet de déterminer d'un seul coup le profil type
de chaque groupe de client que KMeans a identifié.

Je ne conserve que le nombre de *clusters optimal*
pour l'affichage des **Diagrammes de Kiviat**
:

21.6 DBSCAN

DBSCAN est un algorithme de clustering qui s’appuie sur la densité
estimée des clusters pour effectuer le partitionnement.

L'algorithme DBSCAN utilise 2 paramètres :

Les paramètres d'entrées sont donc une estimation de la densité
de points des clusters.
L'idée de base de l'algorithme est ensuite, pour un point donné,
de récupérer son epsilon-voisinage et de vérifier qu'il contient bien
MinPts points ou plus.
Ce point est alors considéré comme faisant partie d'un cluster.
On parcourt ensuite l'epsilon-voisinage de proche en proche afin
de trouver l'ensemble des points du cluster.

Contrairement à KMeans, ici nous ne choisissons pas
à l'avance le nombre de Cluster.

Suppression des colonnes contenant les clusters K-Means dans **df5std** et **df5** :

Test de l'algorithme DBSCAN pour **EPS allant de 0.1 à 1.5** par pas de **0.1** :

Pour chaque **EPS** testé, affichage du nombre de clusters et du coefficient de silhouette :

Affichage du nombre de clients / cluster en fonction de **EPS** :

L'utilisation de DBSCAN dans notre cas est inexploitable
pour une utilisation métier car les clusters ne sont pas équilibrés.

Nous avons par exemple des clusters contenants une dizaine de clients
alors qu'un autre cluster en contient 92290.

21.7 Agglomerative Clustering - Dendrogram

Le dendrogramme est une arborescence qui affiche les groupes formés
par le regroupement des observations à chaque étape et leurs niveaux de similarité.
Le niveau de similarité est mesuré le long de l'axe vertical
et les différentes observations sont répertoriées le long de l'axe horizontal.

21.7.1 Test avec 10 000 données

Plusieurs remarques sont à prendre en compte sur l'utilisation de cette méthode :

22. Contrat de Maintenance

Nous allons dans cette partie étudier
la stabilité des clusters au cours du temps.
A la suite à cette étude, nous réaliserons
une proposition de contrat de maintenance.

Pour étudier la stabilité des clusters
au cours du temps, nous allons calculer
l'écart entre un predict du modèle initial
et le fit d'un nouveau modèle grâce à
la fonction Ajusted_Rand_Score de la façon suivante:
adjusted_rand_score(labels_true, labels_pred)

La fonction Ajusted_Rand_Score
calcule une mesure de similarité
entre deux clusters en considérant
toutes les paires d'échantillons
et en comptant les paires qui sont
assignées dans le même cluster
ou dans des clusters différents
dans les clusters prédits et réels.

Je nomme :

Nous appellerons les différentes périodes
de temps: t, t+1, t+2,..., t+n
où 'n' représente le nombre de mois
entre la période initiale et la période finale.

Nous commencerons notre clusterisation
avec l'état de la base de données ayant
1an d'existence (t=12 mois)
Nous recommencerons les clusterisations
en ajoutant 1 mois de commande, et ainsi de suite.
A chaque itération, nous comparerons
l'état des clusters.

Lorsque l'Ajusted_Rand_Score obtenu est inférieur à 0.8,
nous considérerons que les clusters ne sont plus stables
et il sera donc nécessaire de réaliser un nouveau
clustering sur les données les plus récentes disponibles.

Nous allons donc calculer la période nécessaire
durant laquelle l'Ajusted_Rand_Score passera
systématiquement sous 0.8 et nous établirons
notre proposition de contrat à partir de cette information.

22.1 Modèle et nombre de features retenus

A la suite aux tests précédents, je décide d'utiliser :

22.2 Description des différentes étapes

Nous allons recréer le processus nous permettant
de partir des données importées en début de projet
pour arriver au calcul des labels d'un KMeans à
7 Cluster
sur un jeu de donnée contenant les
commandes clients d'une période de temps choisie.

Chaque étape du processus est
matérialisée par une fonction à
l'exception de la 1ère étape.

22.3 Création du DataFrame data

Nous avons besoin des features suivantes :

Je convertis la colonne '**order_purchase_timestamp**'
dans le bon format
:

22.4 Création des fonctions nécessaires
au calcul de l'Ajusted_Rand_Score

22.5 Affichage de la stabilité des clusters au cours du temps

Nous allons maintenant tracer la stabilité des cluster au cours du temps.
Pour cela, nous calculerons l'Adjusted_Rand_Score sur différentes périodes.
Nous commencerons au plus tôt avec la Base de Données avec 1 année de commandes.
A partir de ce point, nous calculerons l'Adjusted_Rand_Score
successivement en ajoutant 1 mois à chaque itération, sur 5 mois (de t+0 à t+4)
puis nous affichons le score sur un graphique.
Enfin, nous recommencerons le processus en décalant la date de départ
d'un mois (1an + 1mois) et nous répétons la même opération.

Nous réaliserons cette opération 10 fois :

22.6 Conclusion & Proposition de contrat de maintenance

Nous observons que l'Adjusted_Rand_Score n'est pas très stable
au cours du temps et passe la barre de 0.8 après une période
de 1 mois et demi en moyenne.

Dans une simulation de contrat de maintenance, je proposerais
un contrat incluant un recalcul des clusters tous les mois.